#pragma once
#include <iostream>
#include <string>
#include <cstdarg>
#include <cstdio>
#include <time.h>
#include <unistd.h>
#define DEBUG 0
#define NORMAL 1 // 正常
#define WARNING 2
#define ERROR 3 // 普通错误，可以正常运行
#define FATAL 4 // 严重错误，不能正常运行

char *tostring_level(const int level)
{
    switch (level)
    {
    case DEBUG:
        return (char *)"DEBUG";
    case NORMAL:
        return (char *)"NORMAL";
    case WARNING:
        return (char *)"WARNING";
    case ERROR:
        return (char *)"ERROR";
    case FATAL:
        return (char *)"FATAL";
    default:
        return nullptr;
    }
}
// 可变参数列表
// void debugLog(DEBUG,"hello %f %d %c",3.14,10,'C')
void debugLog(const int level, const char *format, ...) // 可变参数列表,参数的压栈顺序从右向左的，形参实例化也是从右向左的
{
#define NUM 1024
    char logprofix[NUM];  // 得到[日志等级][2023-7-23][pid]等信息
    char logcontent[NUM]; // 得到后面的可变参数列表信息
    snprintf(logprofix, sizeof(logprofix), "[%s]-[%ld]-[%d]", tostring_level(level), (long int)time(nullptr), getpid());
    va_list arg;
    va_start(arg, format);
    vsnprintf(logcontent, sizeof(logcontent), format, arg);
    std::cout<<logprofix<<logcontent<<std::endl;
}
